import os  # 导入操作系统模块，用于执行系统级别的操作如清屏命令

# 全局变量，用于存储学生信息列表
student_list = []
# 学生数据文件路径
data_file_path = 'student_information.txt'

def load_student_data_from_file():
    """从文本文件中读取所有学生信息并构建列表数据结构"""
    global student_list
    student_list = []  # 清空当前列表
    
    try:  # 使用异常处理机制来捕获可能出现的文件操作错误
        # 尝试不同的编码格式
        encodings = ['utf-8', 'utf-16', 'utf-16le', 'utf-16be', 'gbk', 'gb2312']
        data_file = None
        
        for encoding in encodings:
            try:
                data_file = open(data_file_path, 'r', encoding=encoding)
                # 尝试读取第一行来验证编码是否正确
                first_line = data_file.readline()
                data_file.seek(0)  # 重置文件指针到开头
                break  # 如果成功读取，跳出循环
            except UnicodeDecodeError:
                if data_file:
                    data_file.close()
                continue  # 尝试下一个编码
        
        if data_file is None:
            # 如果所有编码都失败，创建一个新的空文件
            with open(data_file_path, 'w', encoding='utf-8') as new_file:
                pass  # 创建空文件
            return True
        
        with data_file:  # 使用with语句确保文件正确关闭
            while True:  # 无限循环，直到文件读取完毕
                current_line = data_file.readline()  # 从文件中读取一行数据，包含一个学生的完整信息
                if not current_line:  # 检查是否已经读取到文件的末尾
                    break  # 如果没有更多数据，跳出循环结束读取过程
                current_line = current_line.strip()  # 去除行尾的换行符和空格
                if not current_line:  # 如果是空行，跳过
                    continue
                student_info_array = current_line.split()  # 将读取的一行数据按空格分割成包含各个字段的列表
                if len(student_info_array) < 6:  # 检查数据完整性
                    continue  # 如果数据不完整，跳过这一行
                    
                # 创建学生记录字典
                new_student = {
                    "student_id": int(student_info_array[0]),
                    "student_name": student_info_array[1],
                    "gender": student_info_array[2],
                    "class_name": student_info_array[3],
                    "dormitory": student_info_array[4],
                    "grade": int(student_info_array[5])
                }
                
                # 将新的学生记录添加到列表中
                student_list.append(new_student)
    
    except FileNotFoundError:  # 捕获文件不存在的异常情况
        return False  # 返回False表示文件读取失败
    except Exception as e:  # 捕获其他异常
        print(f"文件读取出错：{e}")  # 显示错误信息
        return False
    return True  # 返回True表示文件读取成功

def write_student_data_to_file():
    """将学生数据保存到文本文件中"""
    with open(data_file_path, 'w', encoding='utf-8') as output_file:  # 以写入模式打开文件，如果文件不存在则创建，存在则覆盖
        for student in student_list:  # 遍历整个学生列表
            output_file.write(f"{student['student_id']} {student['student_name']} {student['gender']} {student['class_name']} {student['dormitory']} {student['grade']}\n")  # 将学生信息按指定格式写入文件
    return True  # 返回True表示文件保存成功

def display_main_menu_interface():
    """清屏并显示系统主菜单选项"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 根据操作系统类型执行相应的清屏命令，Windows使用cls，Linux/Mac使用clear
    print("╔" + "═" * 50 + "╗")  # 显示上边框，使用Unicode字符绘制精美的边框
    print("║" + " " * 15 + "学生信息管理系统" + " " * 15 + "║")  # 显示系统标题，居中对齐
    print("║" + " " * 12 + "Student Management System" + " " * 12 + "║")  # 显示英文副标题，增加专业感
    print("╠" + "═" * 50 + "╣")  # 显示分隔线
    print("║ 1. 📝 增加学生信息 - 添加新的学生档案记录" + " " * 10 + "║")  # 显示添加学生信息的选项，使用emoji图标增加视觉效果
    print("║ 2. 🗑️  删除学生信息 - 移除指定学生的档案" + " " * 10 + "║")  # 显示删除学生信息的选项
    print("║ 3. ✏️  修改学生信息 - 更新学生的详细资料" + " " * 9 + "║")  # 显示修改学生信息的选项
    print("║ 4. 🔍 查询学生信息 - 按条件搜索学生档案" + " " * 9 + "║")  # 显示查询学生信息的选项
    print("║ 5. 📋 输出学生信息 - 显示所有学生列表" + " " * 10 + "║")  # 显示输出所有学生信息的选项
    print("║ 6. 📊 排序学生信息 - 按指定条件排序显示" + " " * 9 + "║")  # 显示排序学生信息的选项
    print("║ 0. 🚪 退出系统 - 安全退出管理系统" + " " * 14 + "║")  # 显示退出系统的选项
    print("╚" + "═" * 50 + "╝")  # 显示下边框
    print("💡 提示：请输入对应的数字选择功能")  # 显示操作提示信息，使用emoji增加友好感
    print("请选择功能（0-6）：", end='')  # 提示用户输入选择，end=''防止自动换行

def insert_new_student_record(student_data):
    """将新的学生记录插入到列表中"""
    global student_list
    student_list.insert(0, student_data)  # 插入到列表开头
    write_student_data_to_file()  # 将更新后的数据保存到文件中

def execute_add_student_operation():
    """处理添加新学生信息的完整流程"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕上的旧内容
    print("╔" + "═" * 40 + "╗")  # 显示操作标题的上边框
    print("║" + " " * 12 + "📝 增加学生信息" + " " * 12 + "║")  # 显示当前操作的标题，使用emoji增加视觉效果
    print("╚" + "═" * 40 + "╝\n")  # 显示下边框
    print("💡 请按照提示输入学生的详细信息：\n")  # 显示操作提示信息
    
    new_student = {}  # 创建一个空的学生记录字典
    
    # 输入学号并进行验证
    while True:  # 开始输入验证循环，确保学号格式正确
        try:  # 使用异常处理来捕获输入错误
            student_id_input = input("🔢 请输入学号（纯数字）：")  # 获取用户输入的学号，使用emoji提示
            new_student["student_id"] = int(student_id_input)  # 将输入转换为整数
            if find_student_by_id(new_student["student_id"]) is not None:  # 检查学号是否已存在
                print("❌ 该学号已存在，请输入其他学号！")  # 显示学号重复的错误提示
                continue  # 继续循环，重新输入
            break  # 如果学号有效且不重复，跳出循环
        except ValueError:  # 如果输入的不是数字
            print("❌ 学号必须是数字，请重新输入！")  # 显示格式错误提示
    
    new_student["student_name"] = input("👤 请输入姓名：")  # 获取用户输入的姓名
    
    # 输入性别并进行验证
    while True:  # 开始性别输入验证循环
        gender_input = input("⚧️ 请输入性别（男/女）：")  # 获取用户输入的性别
        if gender_input in ['男', '女']:  # 验证性别输入是否合法
            new_student["gender"] = gender_input  # 设置性别
            break  # 跳出循环
        else:  # 如果输入不合法
            print("❌ 性别只能输入'男'或'女'，请重新输入！")  # 显示错误提示
    
    new_student["class_name"] = input("🏫 请输入班级：")  # 获取用户输入的班级
    new_student["dormitory"] = input("🏠 请输入宿舍号：")  # 获取用户输入的宿舍号
    
    # 输入成绩并进行验证
    while True:  # 开始成绩输入验证循环
        try:  # 使用异常处理来捕获输入错误
            grade_input = input("📊 请输入成绩（0-100）：")  # 获取用户输入的成绩
            grade_value = int(grade_input)  # 将输入转换为整数
            if 0 <= grade_value <= 100:  # 验证成绩范围是否合理
                new_student["grade"] = grade_value  # 设置成绩
                break  # 跳出循环
            else:  # 如果成绩超出范围
                print("❌ 成绩应在0-100之间，请重新输入！")  # 显示范围错误提示
        except ValueError:  # 如果输入的不是数字
            print("❌ 成绩必须是数字，请重新输入！")  # 显示格式错误提示
    
    insert_new_student_record(new_student)  # 调用插入方法将新学生信息添加到系统中
    print("\n✅ 学生信息添加成功！")  # 显示添加成功的提示信息，使用绿色对勾表示成功
    print("📋 学生档案详情：")  # 显示学生档案标题
    display_single_student_details(new_student)  # 显示刚添加的学生信息
    input("\n🔄 按回车键返回主菜单...")  # 等待用户按回车键继续，使用emoji增加友好感

def execute_remove_student_operation():
    """处理删除指定学生信息的完整流程"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕显示内容
    print("=== 删除学生信息 ===\n")  # 显示删除操作的标题
    target_student_id = int(input("请输入要删除的学生的学号："))  # 获取要删除的学生的学号
    target_student = find_student_by_id(target_student_id)  # 查找目标学生
    
    if target_student is None:  # 如果没有找到指定学号的学生
        print("查无此人！")  # 显示未找到学生的错误信息
    else:  # 如果找到了指定的学生
        student_list.remove(target_student)  # 从列表中移除学生
        write_student_data_to_file()  # 将更新后的学生信息保存到文件
        print("学生信息删除成功！")  # 显示删除成功的提示信息
    
    input("按回车键返回主菜单...")  # 等待用户按回车键继续

def execute_modify_student_operation():
    """处理修改指定学生信息的完整流程"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕内容
    print("=== 修改学生信息 ===\n")  # 显示修改操作的标题
    target_student_id = int(input("请输入要修改的学生的学号："))  # 获取要修改的学生学号
    target_student = find_student_by_id(target_student_id)  # 查找目标学生
    
    if target_student is None:  # 如果没有找到指定学号的学生
        print("查无此人！")  # 显示未找到学生的错误信息
    else:  # 如果找到了指定的学生
        while True:  # 开始修改信息的循环
            os.system('cls' if os.name == 'nt' else 'clear')  # 清屏操作
            print("=== 修改学生信息 ===\n")  # 重新显示修改操作标题
            display_single_student_details(target_student)  # 显示当前学生的详细信息
            print("1. 修改姓名")  # 显示修改姓名选项
            print("2. 修改性别")  # 显示修改性别选项
            print("3. 修改班级")  # 显示修改班级选项
            print("4. 修改宿舍号")  # 显示修改宿舍号选项
            print("5. 修改成绩")  # 显示修改成绩选项
            print("0. 返回主菜单")  # 显示返回主菜单选项
            
            modification_choice = int(input("请输入要修改的信息编号："))  # 获取用户的修改选择
            if modification_choice == 1:  # 如果选择修改姓名
                target_student["student_name"] = input("请输入姓名：")  # 获取新的姓名并更新
            elif modification_choice == 2:  # 如果选择修改性别
                target_student["gender"] = input("请输入性别：")  # 获取新的性别并更新
            elif modification_choice == 3:  # 如果选择修改班级
                target_student["class_name"] = input("请输入班级：")  # 获取新的班级并更新
            elif modification_choice == 4:  # 如果选择修改宿舍号
                target_student["dormitory"] = input("请输入宿舍号：")  # 获取新的宿舍号并更新
            elif modification_choice == 5:  # 如果选择修改成绩
                target_student["grade"] = int(input("请输入成绩："))  # 获取新的成绩并转换为整数后更新
            elif modification_choice == 0:  # 如果选择返回主菜单
                break  # 跳出修改循环
            else:  # 如果输入了无效的选择
                print("无效的选择，请重新输入。")  # 显示错误提示
            
            continue_choice = int(input("是否继续修改该学生信息？（是：1 / 否：0）："))  # 询问是否继续修改
            if continue_choice == 0:  # 如果选择不继续修改
                break  # 跳出修改循环
        
        write_student_data_to_file()  # 保存修改后的学生信息到文件
        print("学生信息修改成功！")  # 显示修改成功的提示
    
    input("按回车键返回主菜单...")  # 等待用户按回车键继续

def execute_search_student_operation():
    """处理查询学生信息的完整流程"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕显示
    print("=== 查询学生信息 ===\n")  # 显示查询操作标题
    print("1. 按学号查询")  # 显示按学号查询的选项
    print("2. 按姓名查询")  # 显示按姓名查询的选项
    
    search_method = int(input("请输入查询方式："))  # 获取用户选择的查询方式
    if search_method == 1:  # 如果选择按学号查询
        search_id = int(input("请输入要查询的学号："))  # 获取要查询的学号
        found_student = find_student_by_id(search_id)  # 调用按学号查找的方法
        if found_student is None:  # 如果没有找到对应学号的学生
            print("查无此人！")  # 显示未找到的提示
        else:  # 如果找到了对应的学生
            display_single_student_details(found_student)  # 显示学生的详细信息
    elif search_method == 2:  # 如果选择按姓名查询
        search_name = input("请输入要查询的姓名：")  # 获取要查询的姓名
        found_student = find_student_by_name(search_name)  # 调用按姓名查找的方法
        if found_student is None:  # 如果没有找到对应姓名的学生
            print("查无此人！")  # 显示未找到的提示
        else:  # 如果找到了对应的学生
            display_single_student_details(found_student)  # 显示学生的详细信息
    
    input("按回车键返回主菜单...")  # 等待用户按回车键继续

def find_student_by_id(target_id):
    """在列表中查找指定学号的学生，返回学生记录或None"""
    for student in student_list:
        if student["student_id"] == target_id:
            return student
    return None

def find_student_by_name(target_name):
    """在列表中查找指定姓名的学生，返回学生记录或None"""
    for student in student_list:
        if student["student_name"] == target_name:
            return student
    return None

def display_single_student_details(student):
    """格式化显示一个学生的所有信息"""
    print(f"┃{student['student_id']:^7}┃{student['student_name']:^9}┃{student['gender']:^5}┃{student['class_name']:^17}┃{student['dormitory']:^9}┃{student['grade']:^6}┃")  # 使用表格格式显示学生信息，居中对齐

def display_all_students_information():
    """显示系统中所有学生的信息列表"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕内容
    print("╔" + "═" * 40 + "╗")  # 显示标题上边框
    print("║" + " " * 12 + "📋 学生信息列表" + " " * 12 + "║")  # 显示学生信息列表的标题
    print("╚" + "═" * 40 + "╝\n")  # 显示标题下边框
    
    if len(student_list) > 0:  # 如果列表中存在学生记录
        print(f"📊 当前系统共有 {len(student_list)} 名学生")  # 显示学生总数统计
        print("📋 详细信息如下：\n")  # 显示详细信息提示
        
        display_table_header()  # 显示表格的列标题
        for student in student_list:  # 遍历所有学生记录
            display_single_student_details(student)  # 显示当前学生的信息
        print("┗━━━━━━━┻━━━━━━━━━┻━━━━━┻━━━━━━━━━━━━━━━━━┻━━━━━━━━━┻━━━━━━┛")  # 显示表格下边框
    else:  # 如果列表为空，没有学生记录
        print("📭 暂无学生信息，请先添加学生记录。")  # 显示空列表提示，使用emoji增加友好感
    
    input("\n🔄 按回车键返回主菜单...")  # 等待用户按回车键继续

def display_table_header():
    """显示学生信息表格的列标题"""
    print("┏━━━━━━━┳━━━━━━━━━┳━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━┓")  # 显示表格上边框，使用Unicode字符
    print("┃ 学号  ┃  姓名   ┃性别 ┃     班级        ┃ 宿舍号  ┃ 成绩 ┃")  # 显示各列的标题，使用表格格式
    print("┣━━━━━━━╋━━━━━━━━━╋━━━━━╋━━━━━━━━━━━━━━━━━╋━━━━━━━━━╋━━━━━━┫")  # 显示表格分隔线

def execute_sort_students_operation():
    """处理学生信息排序的完整流程"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕显示
    print("=== 排序学生信息 ===\n")  # 显示排序操作的标题
    print("1. 按学号从大到小排序")  # 显示按学号降序排序选项
    print("2. 按学号从小到大排序")  # 显示按学号升序排序选项
    print("3. 按成绩从大到小排序")  # 显示按成绩降序排序选项
    print("4. 按成绩从小到大排序")  # 显示按成绩升序排序选项
    
    sort_option = int(input("请选择排序方式："))  # 获取用户选择的排序方式
    
    # 根据不同的排序选项对学生列表进行排序
    if sort_option == 1:  # 按学号从大到小排序
        student_list.sort(key=lambda student: student["student_id"], reverse=True)
    elif sort_option == 2:  # 按学号从小到大排序
        student_list.sort(key=lambda student: student["student_id"])
    elif sort_option == 3:  # 按成绩从大到小排序
        student_list.sort(key=lambda student: student["grade"], reverse=True)
    elif sort_option == 4:  # 按成绩从小到大排序
        student_list.sort(key=lambda student: student["grade"])
    
    write_student_data_to_file()  # 将排序后的结果写入文件
    print("学生信息排序成功！")  # 显示排序完成的提示信息
    input("按回车键返回主菜单...")  # 等待用户按回车键继续

def terminate_system_operation():
    """安全退出系统并显示告别信息"""
    os.system('cls' if os.name == 'nt' else 'clear')  # 清除屏幕显示内容
    print("感谢使用学生信息管理系统，再见！")  # 显示告别信息
    exit(0)  # 调用系统退出函数，结束程序运行

def run_system_main_loop():
    """启动系统的主要运行循环，处理用户的各种操作请求"""
    load_student_data_from_file()  # 系统启动时从文件中加载学生数据
    while True:  # 开始无限循环，持续处理用户操作
        display_main_menu_interface()  # 显示主菜单界面供用户选择
        try:  # 使用异常处理来捕获用户输入错误
            user_selection = int(input())  # 获取用户的菜单选择并转换为整数
        except ValueError:  # 如果用户输入的不是有效数字
            print("输入无效，请输入数字。")  # 显示输入错误提示
            continue  # 跳过当前循环，重新显示菜单
        
        if user_selection == 1:  # 如果用户选择添加学生信息功能
            execute_add_student_operation()  # 执行添加学生信息的操作
        elif user_selection == 2:  # 如果用户选择删除学生信息功能
            execute_remove_student_operation()  # 执行删除学生信息的操作
        elif user_selection == 3:  # 如果用户选择修改学生信息功能
            execute_modify_student_operation()  # 执行修改学生信息的操作
        elif user_selection == 4:  # 如果用户选择查询学生信息功能
            execute_search_student_operation()  # 执行查询学生信息的操作
        elif user_selection == 5:  # 如果用户选择显示所有学生信息功能
            display_all_students_information()  # 执行显示所有学生信息的操作
        elif user_selection == 6:  # 如果用户选择排序学生信息功能
            execute_sort_students_operation()  # 执行排序学生信息的操作
        elif user_selection == 0:  # 如果用户选择退出系统
            terminate_system_operation()  # 执行系统退出操作
        else:  # 如果用户输入了无效的选择
            print("无效的选择，请重新输入。")  # 显示无效选择的错误提示

if __name__ == '__main__':  # 检查当前脚本是否作为主程序运行
    run_system_main_loop()  # 启动管理系统主循环 